/*
 * @Author: weidewei
 * @Date: 2025-11-03 13:57:08
 * @LastEditors: weidewei
 * @LastEditTime: 2025-11-03 14:49:19
 * @Description:
 * @FilePath: \2025-front-face\js常见手写题\debounce.js
 */
// 防抖​​：在事件被触发后，​​等待一段时间再执行函数​​。如果在这段时间内事件​​再次被触发​​，则​​重新计时​​，直到等待时间结束才执行一次。
/* 
    1.创建闭包环境
    2.清除已有定时器​
    3.设置新的定时器​
    4.绑定执行上下文​
    5.传递参数​ 
*/
function debounceES6(fn, wait = 500) {
  let timeout = null;
  return function (...args) {
    timeout && clearTimeout(timeout);
    timeout = setTimeout(() => {
      fn.apply(this, args);
    }, wait);
  };
}

function debounceES5(fn, wait = 500) {
  let timeout = null;
  return function () {
    let ctx = this;
    let args = Array.prototype.slice.call(arguments);
    clearTimeout(timeout);
    timeout = setTimeout(function () {
      fn.apply(ctx, args);
    }, wait);
  };
}
